<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>1、promise与执行机制</title>
</head>
<body>
    <script>
        // promise 状态一旦发生变化，就不在更改：promise的固话
        let p = new Promise(function(resolve, reject){
            setTimeout(function(){
                resolve(1);
                // reject(1);
            }, 2000)
        });
        
        // 异步代码
        p.then(function(res){
            return Promise.resolve(2);
        })
        .then(function(res){
            console.log(res);
        }, function(err){
            console.log(err);
        })

        // promise是一个异步的容器

        var initApp = (function(){
            /**
             * 执行机制
             * 1、同步任务(宏任务)优先执行
             * 2、微任务其次 promise
             * 3、异步任务最后
             * **/

             // 所有的函数都要通过调用栈执行（先进后出）
             // 队列（先进先出）
             
             const first = () => new Promise((resolve, reject) => {
                 console.log(3);

                 let p = new Promise((resolve, reject) => {
                     console.log(7);
                     setTimeout(() => {
                         console.log(5);
                         resolve(6);
                     }, 0);

                     resolve(1);
                 })

                 resolve(2);

                 p.then(arg => {
                     console.log(arg);
                 })
             })
             first().then(arg => {
                 console.log(arg);
             });

             console.log(4);
        });

        var initFn = (function(){
            // 消除 异步操作
            
            // 1：
            // var p1 = new Promise(...);
            // var p2 = new Promise(...);
            // Promise.all([
            //     p1, p2
            // ]).then(res => {
            //     // 成功
            // }, err => {
            //     // 失败
            // })

            // 2：
            // function createPromise(url){
            //     return new Promise((resolve, reject) => {
            //         ...
            //     })
            // }
            // Promise.all([
            //     createPromise(url1),
            //     createPromise(url2),
            // ]).then(res => {
            //     // 成功
            // }, err => {
            //     // 失败
            // })

            // 3：
            // Promise.all([
            //     $.ajax({url2, dataType: 'json'}),
            //     $.ajax({url1, dataType: 'json'}),
            // ]).then(res => {
            //     // 成功
            // }, err => {
            //     // 失败
            // })
        
            // Promise.race() 竞速
        });

        
        initApp();
    </script>
</body>
</html>